package com.baichang.taoshunda.utils;

import com.baichang.framework.utils.LogUtils;
import com.baichang.framework.utils.RedisUtil;
import net.sf.json.JSONObject;
import redis.clients.jedis.Jedis;

import java.util.*;

public class DeliveryUtils {

    /**
     * 获取所有配送员的redis中的key
     *
     * @param pattern 表达式
     *                配送员的格式为 *delivery*
     * @return
     */
    public static List<String> getAllDeliveryRedisKey(String pattern) {
        Set<String> set = RedisUtil.keys(pattern);
        List<String> stringList = new ArrayList<String>();
        for (String str : set) {
            //格式为city**delivery**
            stringList.add(str);
        }
        return stringList;
    }

    /**
     * 获取在范围内的配送人员编号
     * <p>
     * redisKey格式为city+cityId+delivery+deliveryId，如：city123delivery123
     *
     * @param deliveries 所有配送人员的redis的key
     * @param lat        纬度
     * @param lng        经度
     * @param cityId     城市编号
     * @param distance   距离
     * @return
     */
    public static List<Integer> getAreaDelivery(List<String> deliveries, String lat, String lng, Integer cityId, Double distance) {
        List<Integer> areaDeliveryIds = new ArrayList<Integer>();
        //1.开始遍历所有的redis的key,同时获取到所有的配送人员中redis的经纬度信息
        Jedis jedis = RedisUtil.getJedis();
        System.out.println(jedis);
        if (jedis != null) {
            Map<String, Object> maxMinLatLng = LngLatUtil.getAround(lat, lng, distance);
            String maxLat = maxMinLatLng.get("maxLat").toString();
            String minLat = maxMinLatLng.get("minLat").toString();
            String maxLng = maxMinLatLng.get("maxLng").toString();
            String minLng = maxMinLatLng.get("minLng").toString();
            System.out.println("maxlat" + maxLat + "maxLng" + maxLng + "minLat" + minLat + "minlng" + minLng);
            for (String redisKey : deliveries) {
                //2.根据redis的key获取配送员的编号
                Integer id = getDeliveryId(redisKey);
                //3.根据redis的key获取配送人员的城市编号
                Integer deliveryCityId = getDeliveryCityId(redisKey);
                //4.判断两个城市是否相同，不同的话忽略，不进行计算处理
                System.out.println("判断两个城市是否相同，不同的话忽略，不进行计算处理！配送员编号" + deliveryCityId + "cityId" + cityId);
                String deliveryLatLng = jedis.get(redisKey);
                JSONObject jsonObject = JSONObject.fromObject(deliveryLatLng);
                System.out.println("配送员信息"+jsonObject.toString());
                if (!deliveryCityId.equals(cityId)) {
                    System.out.println("不是一个城市");
                    continue;
                }
                //5.获取配送员的经纬度
                //经纬度格式{"lat":"aaaa","lng":"bbbb"}
                System.out.println("每个配送员信息" + jsonObject);
                String deliveryLat = jsonObject.get("lat").toString();
                String deliveryLng = jsonObject.get("lng").toString();
                //6.如果在范围内,将配送员的编号记录下来
                System.out.println(deliveryCityId + "deliveryLat" + deliveryLat);
                if (LngLatUtil.checkIsInArea(maxLat, maxLng, minLat, minLng, deliveryLat, deliveryLng)) {
                    System.out.println("deliveryLat" + deliveryLat + "deliveryLng" + deliveryLng + "id" + id);
                    areaDeliveryIds.add(id);
                }
            }
        }
        return areaDeliveryIds;
    }

    /**
     * 根据redis的key获取配送员的编号
     *
     * @param redosKey reids的key
     * @return
     */
    public static Integer getDeliveryId(String redosKey) {
        return ConvertTypeUtils.obj2Integer(redosKey.substring(redosKey.indexOf("delivery") + 8));
    }

    /**
     * 根据redis的key获取配送员的城市编号
     *
     * @param redosKey reids的key
     * @return
     */
    public static Integer getDeliveryCityId(String redosKey) {
        return ConvertTypeUtils.obj2Integer(redosKey.substring(4, redosKey.indexOf("delivery")));
    }

    /**
     * 上传经纬度
     * <p>
     * redisKey格式为city+cityId+delivery+deliveryId，如：city123delivery123
     * redisValue格式为{"lat":"aaaa","lng":"bbbb"}
     *
     * @param deliveryId 配送员编号
     * @param cityId     城市编号
     * @param lat        纬度
     * @param lng        经度
     * @return
     */
    public static boolean uploadLatLng(Integer deliveryId, Integer cityId, String lat, String lng) {
        try {
            //开始存放配送员的经纬度信息到redis中
            //redisKey格式为city+cityId+delivery+deliveryId，如：city123delivery123
            String redisKey = "city" + cityId + "delivery" + deliveryId;
            //redisValue格式为{"lat":"aaaa","lng":"bbbb"}
            Map<String, Object> latLngMap = new HashMap<String, Object>();
            latLngMap.put("lat", lat);
            latLngMap.put("lng", lng);
            String redisValue = JSONObject.fromObject(latLngMap).toString();
            RedisUtil.setex(redisKey, redisValue, 5 * 60);
        } catch (Exception e) {
            LogUtils.getInstance().info(e.getMessage());
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
//        String str = "{\"lat\":\"aaaa\",\"lng\":\"bbbb\"}";
//        JSONObject jsonObject = JSONObject.fromObject(str);
//        System.out.println(jsonObject.get("lat"));
        double maxLatD = 117.2031189072979;
        double maxLngD = 36.71957019861039;
        double minLatD = 117.09108909270209;
        double minLngD = 36.62971780138961;
        double latitude2 = 36.677797;
        double longitude2 = 117.146582;
        System.out.println("latitude2 >= minLatD" + (latitude2 >= minLatD));
        System.out.println("latitude2 <= maxLatD" + (latitude2 <= maxLatD));
        System.out.println("longitude2 >= minLngD" + (longitude2 >= minLngD));
        System.out.println("longitude2 <= maxLngD" + (longitude2 <= maxLngD));
    }

}
